package com.shujia.custom.udtf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

import java.util.ArrayList;

public class MyUDTFDemo2 extends GenericUDTF {
    /*
        public StructObjectInspector initialize(StructObjectInspector argOIs)
        指定输出的列的名称以及列的类型
        M1001#xiaohu#S324231212,sp#M1002#S2543412432,S21312312412#M1003#dyj

        1001 xiaohu 324231212
     */
    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
        //创建一个List集合存储结果列的名字
        ArrayList<String> colNames = new ArrayList<>();
        //创建一个集合存储每一列的数据类型
        ArrayList<ObjectInspector> colTypes = new ArrayList<>();

        //向集合中添加元素，设置列的名字以及类型
        colNames.add("col1");
        colTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        colNames.add("col2");
        colTypes.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        //返回一个对象，该对象封装了列的名字以及列的类型
        return ObjectInspectorFactory.getStandardStructObjectInspector(colNames, colTypes);
    }

    /*
        process方法主要是在调用函数的时候，底层会进行调用处理传入的列数据

        "key1:value1,key2:value2,key3:value3"
        args: 接收函数调用时传入的列数据，从索引0开始
     */
    @Override
    public void process(Object[] args) throws HiveException {

        //创建一个数组，存储每一列的数据
        //因为结果一行数据中有3列，需要创建一个长度为3的数组，用来存储我们处理过的一行三列数据
//        String[] rows = new String[2];

        //args[0]是传入的第一个列数据
        String col = args[0].toString(); // "key1:value1,key2:value2,key3:value3"
        String[] infos = col.split(",");
        //遍历切分后的数组，得到每一个用户信息
        for (String info : infos) {
            String[] strings = info.split(":");
//            rows[0] = strings[0];
//            rows[1] = strings[1];

            //forward(Object o) 调用概述方法，将输出的一行数据，封装成一个数组，传入到forward方法中，给hive后续处理
            forward(strings);
        }
    }

    @Override
    public void close() throws HiveException {
        //这里一般是用作释放在initialize方法中创建的资源

    }
}
